המדריך המלאה למערכת התבניות הטובה ביותר.
חלק א' - הכרות, הפעלה - שימוש ומאפיינים מיוחדים.
Twig project
Twig הינה מערכת תבניות המאפשרת לבצע הפרדה בין קוד ה-HTML וה-PHP באתרינו(MVC - Model Viewer Controller).
הסבר מפורט על המוסג MvC תוכלו למצוא בכתובת הבאה - תודה לאלכס על כתיבת המדריך.
ל-Twig המון מאפיינים אשר הופכים אותה לשונה ומיוחדת יותר מאחרים, בין המאפיינים שלה 3 מאפיינים בולטים - מהירות, אבטחה וגמישות - פירוט מלא בהמשך המדריך\כתבה.
שלושת המאפיינים הכי חשובים
כמו שאמרתי בהתחלה ל-Twig המון מאפיינים שהופכים אותה לשונה ומיוחדת יותר ממערכות אחרות, ביניהם 3 מאפיינים בולטים וחשובים מאוד:
* מהירות: Twig ממירה את הקוד שנכתב בתבנית לקוד PHP מהיר ויעיל, מה שאנחנו כמעט תמיד לא עושים.
* אבטחה: ל-Twig אפשרויות אבטחה גדולות - ביניהם מצב SandBox, AutoEscape ורבים אחרים...
* גמישות: Twig פועלת על lexer ו-parser גמישים במיוחד, הדבר זה מאפשר למפתחים להגדיר תגיות ומסננים מותאמים אישית.
אבל PHP היא שפת תבנית, לא?
כשזה מגיע למנועי תבנית ב-PHP, הרבה אנשים יגידו לך שPHP עצמו הוא מנוע תבנית.
אבל גם אם PHP התחיל את חייו כשפת תבנית, זה לא התפתח הרבה בשנים האחרונות.
השוואה בין הקוד של TwiG לשל PHP
* קוד מתומצת:
<?php echo $var ?>
<?php echo htmlspecialchars($var, ENT_QUOTES, 'UTF-8') ?>
<?php echo htmlspecialchars($var, ENT_QUOTES, 'UTF-8') ?>
{{ var }}
{{ var|escape }}
{{ var|e }}
{{ var|escape }}
{{ var|e }}
* קוד דומה בשני האפשרויות:
{% for user in users %}
* {{ user.name }}
{% else %}
No user have been found.
{% endfor %}
* {{ user.name }}
{% else %}
No user have been found.
{% endfor %}
<?php
if(count($users)) {
foreach($users as $user) {
echo '* '. $user .'<br />';
}
} else {
echo 'No user have been found.';
}
?>
if(count($users)) {
foreach($users as $user) {
echo '* '. $user .'<br />';
}
} else {
echo 'No user have been found.';
}
?>
* אפשרויות רבות:
{% extends "layout.html" %}
{% block content %}
Content of the page...
{% endblock %}
{% block content %}
Content of the page...
{% endblock %}
* לימוד קל וקליט: התחביר הוא קל ללימוד ועבר אופטימיזציה כדי לאפשר למעצבי אינטרנט לעשות עבודתם מהר מבלי לסבך את חייהם.
* אבטחה - פלט מאובטח בצורה אוטומטית:
{% autoescape true %}
{% var %}
{% var|raw %} {# var won't be escaped #}
{% var|escape %} {# var won't be doubled-escaped #}
{% endautoescape %}
{% var %}
{% var|raw %} {# var won't be escaped #}
{% var|escape %} {# var won't be doubled-escaped #}
{% endautoescape %}
{% include "user.html" sandboxed %}
הורדה והתקנה של Twig
אחרי שהכרנו את המערכת וראינו את הצד הטוב של המערכת ניגש להורדה והתקנת המערכת.
הורדה
על מנת להוריד את המערכת לחצו כאן ותורידו את הגירסא הכי חדשה.
הגירסא הנוכחית: 1.9.1, כאן.
התקנה
לאחר ההורדה יש מספר צעדים פשוטים על מנת להתקין את המערכת, קודם כל יש לדאוג שיש לכם תיקיה שאיתה תעבדו.
עכשיו חלצו את הקובץ שהורדתם לשולחן העבודה\כל מקום אחר שבא לכם.
כעת צרו תקיה חדשה בשם Protected, העבירו לשם את התקייה fabpot-Twig-0c7a0d7\lib\Twig - (לא את התוכן את כל התקיה!).
תחילת עבודה עם Twig ותוכנית ראשונה - Hello World
כעת אחרי שהכל מוכן ניצור את הדף הראשון שלנו, בשביל לעשות זות צרו דף בשם hello.php (דוגמא!).
נכניס לשם את הקוד הבא:
<?php
require_once '/path/to/Protected/Twig/Autoloader.php';
Twig_Autoloader::register();
$loader = new Twig_Loader_String();
$twig = new Twig_Environment($loader);
echo $twig->render('Hello {{ world }}!', array('world' => 'World!'));
?>
require_once '/path/to/Protected/Twig/Autoloader.php';
Twig_Autoloader::register();
$loader = new Twig_Loader_String();
$twig = new Twig_Environment($loader);
echo $twig->render('Hello {{ world }}!', array('world' => 'World!'));
?>
הסבר שורה אחרי שורה
1: יבוא של הקובץ Autoloader שאחראי לעבודה של המערכת, ניתן במקום require_once להשתמש ב include_once.
_once - בודק האם הקובץ כבר בשימוש בעבר, ורק אם לא מיבא את הקובץ.
2: הפעלת המערכת על ידי קראיה לפונקציה register שנימצאת במחלקה Twig_Autoloader.
4: מגדירים משתנה שמשתווה לתשובת המחלקה Twig_Loader_String אשר אחראית לטעינת התבניות.
5: מגדירים משתנה נוסף שאחראי לביצוע פעולות המערכת בתבניות שנקראות על ידי המחלקה Twig_Loader_String.
7: מדפיסים את הקוד המוכן לאחר ביצוע כל הפקודות בתבנית - המשתנה הראשון זוהי התבנית, המשתנה השני מערך של "משפטים".
נריץ אותו ונקבל פלט כזה: "Hello World!!".
בפרק הבא
* יצירת תבניות מתקדמות
* שימוש ב-include
* כיצד משתמשים ב Layout ו Blockים?
בהצלחה!
חלק ב
* חלק ב' כאן
תגובות לכתבה:
twig היה מנוע התבניות הראשון שהשתמשתי בו.
הוא מדהים :) ממנו הגיע לקוד שלי הפונקציה e שמשמשת אותי בתור קיצור ל htmlSpecialChars
רפאל, הרבה תודות על המדריך :)
מחכה בקוצר רוח לחלק ב'
תודה רבה על המדריך. :)
אין קשר בין mvc ל-twig שהיא template engine.
מחזק את זה שמעלי, אין קשר. הוא כן מסייע בהפרדה בין הלוגיקה לעיצוב בצורה טובה אך איננו ממש את כל התבנית MVC.
עדין, לי מזכיר ROR ואני מעדיף כמה שפחות להתקרב....אבל אחלה דבר למי שיש לו עצבים כמו Smarty
תודה רבה על המדריך ?
יש אפשרות לעבוד עם מסד איתה ביחד ? שהשליפה תהיה בעזרת המנוע שלה כבר ולא ע"י רינדור של PHP ?
תודה רבה על המדריך ! *
אתה יכול לעשות דבר כזה:
$sth = $db->prepare("SELECT* FROM table INNER JOIN table2 ON table.id = table2.id WHERE category = ? ORDER BY table.id DESC");
$sth->execute(array(1514125));
echo $twig->render("page.html", array('forllop1' => $sth->fetchAll()));
וזה הקוד של התבנית:
{% for id, item in forllop1 %}
* {{ id }}: {{ item['key'] }}
{% else %}
Not found!
{% endfor %}
^ נכתב באתר...
מישהו יכול לכתוב פה את פונקציית ה escape שלהם כמו שהיא בקוד המקור שלהם, כלומר את הפונקציה עצמה?
למה קשה להכנס ל-github שלהם ולראות את הקובץ Core.php ב-lib/Twig/Extension.
twig_escape_filter
שום דבר מיוחד - htmlspecialchars כרגיל.
תודה רבה, אני עכשיו מתחיל ללמוד פעם ראשונה איך לעבוד עם framework ו MVC.
@dan_barzilay אם אתה מנסה לכתוב מערכת תבניות כמו TWIG, אז אתה מבזבז זמן.
כל מקרה הם משתמשים ב htmlspecialchars רגיל(http://php.net/manual/en/function.htmlspecialchars.php).
לדעתי הוא בכלל לא מבזבז זמן, זו אחלה התנסות לכתוב כל מיני דברים .